import { NextRequest, NextResponse } from "next/server"; import { prisma } from "@/lib/prisma"; import { logActivity } from "@/lib/activity"; import { trashFiles } from "@/lib/trash"; export async function GET( request: NextRequest, { params }: { params: { id: string } } ) { const file = await prisma.file.findUnique({ where: { id: params.id }, include: { folder: true, sharedLinks: true, metadata: true, tags: { include: { tag: true } }, _count: { select: { versions: true } } }, }); if (!file) { return NextResponse.json({ error: "File not found" }, { status: 404 }); } return NextResponse.json({ ...file, size: Number(file.size) }); } export async function PATCH( request: NextRequest, { params }: { params: { id: string } } ) { const body = await request.json().catch(() => ({})); const { name, folderId } = body as { name?: string; folderId?: string | null }; const file = await prisma.file.findUnique({ where: { id: params.id } }); if (!file) { return NextResponse.json({ error: "File not found" }, { status: 404 }); } const updateData: Record = {}; if (name !== undefined) { const trimmed = typeof name === "string" ? name.trim() : ""; if (!trimmed) return NextResponse.json({ error: "Nom requis" }, { status: 400 }); if (/[\\/]/.test(trimmed)) return NextResponse.json({ error: "Le nom ne peut pas contenir « / » ou « \\ »" }, { status: 400 }); if (trimmed !== file.name) { updateData.name = trimmed; await logActivity("RENAME", params.id, `Renamed ${file.name} -> ${trimmed}`); } } if (folderId !== undefined) { const target = folderId === "root" || folderId === null ? null : folderId; if (target) { const exists = await prisma.folder.findUnique({ where: { id: target }, select: { id: true } }); if (!exists) return NextResponse.json({ error: "Dossier de destination introuvable" }, { status: 404 }); } if (target !== file.folderId) { updateData.folderId = target; await logActivity("MOVE", params.id, `Moved ${file.name} to folder ${folderId}`); } } if (Object.keys(updateData).length === 0) { return NextResponse.json({ ...file, size: Number(file.size) }); } const updated = await prisma.file.update({ where: { id: params.id }, data: updateData, }); return NextResponse.json({ ...updated, size: Number(updated.size) }); } /** Mise à la corbeille (restaurable 30 jours) — l'origine est mémorisée pour la restauration. */ export async function DELETE( request: NextRequest, { params }: { params: { id: string } } ) { const file = await prisma.file.findUnique({ where: { id: params.id }, select: { id: true, deletedAt: true } }); if (!file) { return NextResponse.json({ error: "File not found" }, { status: 404 }); } if (file.deletedAt) { return NextResponse.json({ success: true, alreadyTrashed: true }); } await trashFiles([file.id]); return NextResponse.json({ success: true }); }